package com.atguigu.gulimall.seckill;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * 整合Sentinel
 * 1、导入依赖  spring-cloud-starter-alibaba-sentinel
 * 2、下载sentinel 控制台
 * 3、配置sentinel控制台地址信息
 * 4、在控制台上调整参数
 *
 * 5、导入 spring-boot-starter-actuator
 *    配置 management.endpoints.web.exposure.include= *
 *
 *
 * 使用Sentinel 保护feign 远程调用 熔断
 *      1、调用方的熔断保护：feign.sentinel.enabled=true
 *      2、调用方手动指定远程服务的降级策略。远程服务被降级处理。触发我们的熔断回调方法
 *      3、超大游览时候，必须牺牲一些远程服务。在服务的提供方（远程服务）指定的降级策略
 *         提供方是在运行，但是不运行自己的业务逻辑，返回的是默认的降级数据（限流的数据）
 *
 * 自定义受保护资源
 *  1 代码 try(Entry entry = SphU.entry("sekillSkus")){}catch(Execption e){}
 *  2 基于注解
 * @SentinelResource(value="getCurrentSekillResource",blockHander="blockHandler")
 * 无论那种情况都要配置被限流以后的默认返回，url可以设置同一返回
 *
 * @SentinelResource(value = "fallback",
 *                   fallback = "handlerFallback",
 *                   blockHandler = "blockHandler",
 *                   exceptionsToIgnore = {IllegalArgumentException.class})
 *
 *     fallback 管运行异常
 *     blockHander 管配置违规(流控，降级)
 *     exceptionsToIgnore  降级时候忽略这个异常
 *
 *
 * 网关层面进行控制，在网关添加spring-cloud-alibaba-sentinel-gateway 依赖
 *
 */
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
@EnableFeignClients
public class GulimallSeckillApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimallSeckillApplication.class, args);
    }

}
